{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-01-15T06:50:58.356301Z",
     "start_time": "2025-01-15T06:50:58.351643Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 2.2.1\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 33
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:50:58.390422Z",
     "start_time": "2025-01-15T06:50:58.386797Z"
    }
   },
   "cell_type": "code",
   "source": "28*28",
   "id": "163fc2c7255fd887",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 34
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 数据准备",
   "id": "e53733439514cd4a"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:34.567951Z",
     "start_time": "2025-01-15T06:57:34.529188Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(), # 转换为tensor，进行归一化\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "id": "b14e7cd718ec1db2",
   "outputs": [],
   "execution_count": 52
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:50:58.462242Z",
     "start_time": "2025-01-15T06:50:58.458195Z"
    }
   },
   "cell_type": "code",
   "source": "type(train_ds)",
   "id": "b6c6ba7d8acc241e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 36
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:50:58.467202Z",
     "start_time": "2025-01-15T06:50:58.462242Z"
    }
   },
   "cell_type": "code",
   "source": "len(train_ds)",
   "id": "3b3ef553622147c6",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 37
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:50:58.475714Z",
     "start_time": "2025-01-15T06:50:58.470208Z"
    }
   },
   "cell_type": "code",
   "source": "type(train_ds[0])",
   "id": "59a6dab39d3aeb68",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 38
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:36.775074Z",
     "start_time": "2025-01-15T06:57:36.769565Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]\n",
    "img.shape\n",
    "# img.shape = ("
   ],
   "id": "ee0e7cb32febefbb",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 28, 28])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 53
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:51:11.719538Z",
     "start_time": "2025-01-15T06:51:11.716263Z"
    }
   },
   "cell_type": "code",
   "source": "type(img) #tensor中文是 张量,和numpy的ndarray类似",
   "id": "3da3be40eda04051",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 41
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:38.969053Z",
     "start_time": "2025-01-15T06:57:38.960783Z"
    }
   },
   "cell_type": "code",
   "source": "img[0] # 取出第一个像素值",
   "id": "1e682157862c8a6",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
       "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
       "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
       "         0.0118],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
       "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
       "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
       "         0.0588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
       "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
       "         0.2588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
       "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
       "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
       "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
       "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
       "         0.2039],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
       "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
       "         0.2196],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
       "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
       "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
       "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
       "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
       "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
       "         0.0000],\n",
       "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
       "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
       "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
       "         0.0000],\n",
       "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
       "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
       "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
       "         0.0000],\n",
       "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
       "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
       "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
       "         0.1137],\n",
       "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
       "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
       "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
       "         0.2627],\n",
       "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
       "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
       "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
       "         0.4510],\n",
       "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
       "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
       "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
       "         0.3608],\n",
       "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
       "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
       "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
       "         0.0000],\n",
       "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
       "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
       "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
       "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000]])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 54
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:40.648006Z",
     "start_time": "2025-01-15T06:57:40.641625Z"
    }
   },
   "cell_type": "code",
   "source": "img #不实际化就是图像",
   "id": "c649e74729a5677d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510,\n",
       "          0.2863, 0.0000, 0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0039, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333,\n",
       "          0.4980, 0.2431, 0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118,\n",
       "          0.0157, 0.0000, 0.0000, 0.0118],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000,\n",
       "          0.6902, 0.5255, 0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0471, 0.0392, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255,\n",
       "          0.8118, 0.6980, 0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902,\n",
       "          0.3020, 0.5098, 0.2824, 0.0588],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745,\n",
       "          0.8549, 0.8471, 0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725,\n",
       "          0.5529, 0.3451, 0.6745, 0.2588],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098,\n",
       "          0.9137, 0.8980, 0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980,\n",
       "          0.4824, 0.7686, 0.8980, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471,\n",
       "          0.8745, 0.8941, 0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667,\n",
       "          0.8745, 0.9608, 0.6784, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549,\n",
       "          0.8353, 0.7765, 0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745,\n",
       "          0.8627, 0.9529, 0.7922, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314,\n",
       "          0.8549, 0.7529, 0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314,\n",
       "          0.8863, 0.7725, 0.8196, 0.2039],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627,\n",
       "          0.8549, 0.7961, 0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627,\n",
       "          0.9608, 0.4667, 0.6549, 0.2196],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020,\n",
       "          0.8941, 0.9412, 0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510,\n",
       "          0.8510, 0.8196, 0.3608, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745,\n",
       "          0.8706, 0.8588, 0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431,\n",
       "          0.8549, 1.0000, 0.3020, 0.0000],\n",
       "         [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667,\n",
       "          0.8549, 0.8157, 0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431,\n",
       "          0.8784, 0.9569, 0.6235, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196,\n",
       "          0.7412, 0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039,\n",
       "          0.8275, 0.9020, 0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725,\n",
       "          0.9137, 0.9333, 0.8431, 0.0000],\n",
       "         [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157,\n",
       "          0.8000, 0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569,\n",
       "          0.8078, 0.8745, 1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275,\n",
       "          0.8627, 0.9098, 0.9647, 0.0000],\n",
       "         [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392,\n",
       "          0.8039, 0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000,\n",
       "          0.8980, 0.8667, 0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196,\n",
       "          0.8706, 0.8941, 0.8824, 0.0000],\n",
       "         [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176,\n",
       "          0.9765, 0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863,\n",
       "          0.4157, 0.4588, 0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745,\n",
       "          0.8745, 0.8784, 0.8980, 0.1137],\n",
       "         [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824,\n",
       "          0.8471, 0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647,\n",
       "          0.8902, 0.9608, 0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706,\n",
       "          0.8627, 0.8667, 0.9020, 0.2627],\n",
       "         [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451,\n",
       "          0.7608, 0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255,\n",
       "          0.8824, 0.8471, 0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745,\n",
       "          0.7098, 0.8039, 0.8078, 0.4510],\n",
       "         [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686,\n",
       "          0.8000, 0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686,\n",
       "          0.7608, 0.7490, 0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118,\n",
       "          0.6549, 0.6941, 0.8235, 0.3608],\n",
       "         [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745,\n",
       "          0.6863, 0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765,\n",
       "          0.8000, 0.8196, 0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608,\n",
       "          0.7529, 0.8471, 0.6667, 0.0000],\n",
       "         [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294,\n",
       "          0.9373, 0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569,\n",
       "          0.7490, 0.7020, 0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588,\n",
       "          0.3882, 0.2275, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569,\n",
       "          0.2392, 0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000]]])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 55
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:48.514456Z",
     "start_time": "2025-01-15T06:57:42.085982Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#计算均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds: # 遍历每张图片,img.shape=[1,28,28]\n",
    "        mean += img.mean(dim=(1, 2)) #dim=(1,2)表示对每张图片的每一个像素点求均值\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))"
   ],
   "id": "d68d6507a940864a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 56
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:48.518605Z",
     "start_time": "2025-01-15T06:57:48.515491Z"
    }
   },
   "cell_type": "code",
   "source": "type(img)",
   "id": "547aec060b197b84",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 57
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:48.524754Z",
     "start_time": "2025-01-15T06:57:48.519624Z"
    }
   },
   "cell_type": "code",
   "source": "label",
   "id": "1b72b71e15ab653d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 58
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:48.528848Z",
     "start_time": "2025-01-15T06:57:48.525762Z"
    }
   },
   "cell_type": "code",
   "source": "type(img) #tensor中文是 张量,和numpy的ndarray类似",
   "id": "df96b9612a3a7e05",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 59
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:48.532557Z",
     "start_time": "2025-01-15T06:57:48.528848Z"
    }
   },
   "cell_type": "code",
   "source": "label",
   "id": "2386eb88586d0b8e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 60
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:57:48.536609Z",
     "start_time": "2025-01-15T06:57:48.532557Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L':\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(pixel_values)\n",
    "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "id": "639202353fb0d0e9",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: <built-in method size of Tensor object at 0x000001D0D03A8FA0>\n",
      "图像模式: <built-in method mode of Tensor object at 0x000001D0D03A8FA0>\n"
     ]
    }
   ],
   "execution_count": 61
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:58:17.173854Z",
     "start_time": "2025-01-15T06:58:17.170374Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_single_image(img_arr):\n",
    "    plt.imshow(img_arr, cmap=\"binary\")  # 显示图片\n",
    "    plt.colorbar()  # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "#show_single_image(img)"
   ],
   "id": "5aaa1e92b2c9f5f8",
   "outputs": [],
   "execution_count": 64
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T06:58:05.176639Z",
     "start_time": "2025-01-15T06:58:04.927729Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation = 'nearest')#interpolation='nearest'是临近插值\n",
    "            plt.axis('off')#去除坐标系\n",
    "            plt.title(class_names[label]) # 显示类别名称\n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)"
   ],
   "id": "3500236860fceb9e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb4tJREFUeJztnQe41FS3hoPSe++9SRekIwqCiDQFRRFFQBRRUcGG/Cr2hogoImDFgvyi0hEFFJCuFKnSm/TeBFGQuc/KvZP7ZZ3sMOdwymTme5/nwJ7Jnkxmt+ysmi4UCoUsQgghhJAAcklaXwAhhBBCSFLhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGCJqo1M9+7drezZs1+wXtOmTe2/5ELOVa1atWQ7H0ketm/fbqVLl8568803L1j3+eeft+uS6IH9R0jasj1O5uBFb2SGDx9u//j69esnzxXFGa+++qo1ceJEK4hIv0fyN2fOHCuaOH36tD1po+26Uhv2X+zx6aefuvouc+bMVtGiRa2WLVtaQ4cOtU6ePJnWl0gAzsHkIf3FnuDLL7+0Spcubf3666/W5s2brfLlyyfPlcXRRqZjx45W+/btraDxxRdfuF5//vnn1syZMxO8X7ly5RS/lmeeecbq379/xJPwhRdesMvJKdkLGuy/2OXFF1+0ypQpY509e9bat2+ffcPp27ev9dZbb1mTJ0+2atSokdaXSDgHo2Mjs23bNmvhwoXW+PHjrV69etmbmueeey75ro5ENV26dHG9Xrx4sT0J9fupQfr06e0/P86fP2/9888/qXZN0Q77L3Zp1aqVVadOHef1f/7zH2vWrFlW27ZtrRtuuMFat26dlSVLFs/Pnjp1ysqWLVsqXm38wjkYBaol2bjkyZPHatOmjS1VkNd+OroPPvjAKleunJUpUyarbt261pIlSy74HStWrLAKFChg7/r+/PNPY72///7b3kSJREjOX6JECatfv372+5GybNkyq1GjRvYEl6eZkSNHJqhz4MAB6+6777YKFSpki20vv/xy67PPPvNcDB577DH7OuR6LrvsMrsNMNm4tIvUk8+HRYhiJxQvLF261BZ558+f32nzHj16eNa90Njx0u/K6wcffNAel1WrVrU/K30q40mQJ4pwu8vnSeJg/wWLZs2aWQMGDLB27NhhjR492mWXuGXLFqt169ZWjhw5rDvuuMO5ab399tt228taJ2uePLAePXo00ePgq6++smrXrm2fP2fOnFb16tWtd955JxV/fWzCOZgMEhn5cTfddJOVMWNGq3PnztaIESPsxpFG0owZM8bWz8pEkB/9xhtv2J/dunWrlSFDBs/zy7mkk+TJYtKkScYnCJlw8pQxf/58695777XFcKtXr7aGDBlibdy4MSIbFJmcMpFvvfVW+7d8/fXX1v3332//tvDA+Ouvv+wNlajQpHNl0HzzzTf2YnDs2DGrT58+dj3ZrMj1zJ4929701KxZ05o+fbr1xBNPWLt377avSxDx4T333GPVq1fPvm5BBlo8IBvC6667zp4QIs7MnTu3vekV6V5yjJ0w8hQqfSn9JZNdNp4yTqVvO3ToYJ9HoKg9cbD/gsmdd95pPfXUU9aMGTOsnj172u+dO3fOXmcbN25sP2xlzZrVfl/6S2xu7rrrLuvhhx+2JfDDhg2zfvvtN2vBggV230UyDkTCIGtq8+bNrYEDB9rviURIzhFeM0ni4RwEQklk6dKlIloIzZw50359/vz5UPHixUN9+vRx1du2bZtdL1++fKEjR44470+aNMl+f8qUKc573bp1C2XLls0uz58/P5QzZ85QmzZtQmfOnHGds0mTJvZfmC+++CJ0ySWXhObNm+eqN3LkSPs7FixY4Ptb5FxSb/Dgwc57f//9d6hmzZqhggULhv755x/7vbffftuuN3r0aKeeHGvYsGEoe/bsoRMnTtjvTZw40a738ssvu76nY8eOoXTp0oU2b97svCe/V353LNC7d2/7d0fChAkT7LpLliwx1knM2HnuuecSfLe8lnGxdu1a1/sHDx60j8lnyP/D/gs+o0aNumC/5MqVK1SrVi27LGuP1O/fv7+rjqyl8v6XX37pev+HH35wvR/JOJB7gqzl586du8hfF/twDiaNSy5GGiOixmuuucZ+Lbu8Tp062SLEf//9N0F9OSZqqDBXXXWV/b/sCDUiyZAnBNnBy+5SxFl+iFREpDCVKlWyDh065PyJKDV8vgshukHZrYYRSYy8ll2vqJyEadOmWYULF7afLsLIblaeVkTt9fPPPzv1Lr30Uvt9RFRNMja+//57K96Rpwdh6tSptkGiH4kZO5omTZpYVapU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YOFGhhBCCCGBhRsZQgghhASWmN7IbN++3UqXLp315ptvXrDu888/b9clF0f37t2t7NmzX7Be06ZN7b/kQs5VrVq1ZDsfSV0+/fRTe/7JnE3KmCtdunSKXBeJDPZffNwno5U03chI40XyN2fOHCuaOH36tL3xibbrSirDhw+327l+/fppfSmB5NVXX7UmTpxoBY3Vq1dbHTt2tEqVKmVlzpzZKlasmNWiRQvr3XffTetLIxHA/gsO7KuUJb2VhnzxxReu159//rk1c+bMBO9Xrlw5xa/lmWeesfr37x/xRuaFF16wy8kpVUgrvvzyS/uJ6Ndff7U2b95slS9fPq0vKXAbGVmk2rdvbwWFhQsXWtdcc41VsmRJq2fPnlbhwoWtnTt3WosXL7beeecd66GHHkrrSyQ+sP+CA/sqxjcyXbp0cb2WjpWNjH4/NUifPr3958f58+etf/75x4oltm3bZk+08ePHW7169bI3Nc8991xaXxZJYV555RUrV65c1pIlS6zcuXO7jh04cCDNrotEBvsvOLCvLPvhP2vWrCl2/kDbyCxdutRq2bKllT9/fitLlixWmTJlrB49enjW/eCDD6xy5cpZmTJlsurWrWsPqgvZyMjrBx980L65V61a1f7syJEjrQIFCtjHRSoTVn/J54OI/LY8efJYbdq0saUK8tpPh3qhdvRixYoVdpuJ9OrPP/801vv777/tTZRIhOT8JUqUsPr162e/HynLli2zGjVq5IwH6S+NLB533323VahQIVvMe/nll1ufffZZgnqnTp2yHnvsMfs65Houu+wyuw1CoZBTR9pF6snnw2NBdP7RzpYtW+wxrRdWoWDBgk551KhRVrNmzez3pA2qVKlijRgxIsFnRKLXtm1ba/78+Va9evXsdi1btqwtZdWsXbvWPqf0UfHixa2XX37ZfkjQTJo0yR6XRYsWtb9bxt1LL71k/fvvv1a8w/6Lvb4K329ETS32ftJm8rkffvghwed2795t3+tkDcv0f/U++eQTVx156H722Wet2rVr2xupbNmyWVdddZU1e/bsC16zrHH33nuvlTFjRvshN8zo0aPt80nf582b17rtttts6ZKXvaKsxVdffbW9gXnqqaesmJXIXAxyM7ruuuvsG6SohGSQyA0XGz3MmDFjrJMnT9oSBxksb7zxhnXTTTdZW7dutTJkyOD7PbNm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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 63
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:03:11.975055Z",
     "start_time": "2025-01-15T07:03:11.970994Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批，shuffle洗牌\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "id": "1ce630d07c2f676e",
   "outputs": [],
   "execution_count": 65
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "ae5b9e36f01740df"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## 解释\n",
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。"
   ],
   "id": "233be3e9fa4336db"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 模型定义",
   "id": "d2d2becda8301ac2"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:09:38.729232Z",
     "start_time": "2025-01-15T07:09:38.702302Z"
    }
   },
   "cell_type": "code",
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(300, 100),#隐藏层神经元数100\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(100, 10),#输出层神经元数10\n",
    "        )\n",
    "\n",
    "    def forward(self, x): # 前向计算\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits #没有经过softmax,称为logits\n",
    "    \n",
    "model = NeuralNetwork()"
   ],
   "id": "e2ec1284028b3cb3",
   "outputs": [],
   "execution_count": 66
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:11:32.640588Z",
     "start_time": "2025-01-15T07:11:32.635998Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 看看网络结构\n",
    "model"
   ],
   "id": "855b149ecbd51c8a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 67
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:11:37.983432Z",
     "start_time": "2025-01-15T07:11:37.978260Z"
    }
   },
   "cell_type": "code",
   "source": "784*300+300+300*100+100+100*10+10 #计算参数数量",
   "id": "306d9b68149cfa01",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "266610"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 68
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:11:45.780588Z",
     "start_time": "2025-01-15T07:11:45.777251Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for name, param in model.named_parameters(): # 打印模型参数\n",
    "      print(name, param.shape)"
   ],
   "id": "3b6614df054fb717",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 69
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:11:50.523871Z",
     "start_time": "2025-01-15T07:11:50.509772Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True"
   ],
   "id": "dbcef1ccaf9218f1",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[ 0.0232, -0.0200, -0.0203,  ..., -0.0145,  0.0110,  0.0062],\n",
       "         [-0.0285,  0.0016, -0.0011,  ...,  0.0333,  0.0004, -0.0057],\n",
       "         [-0.0341, -0.0305,  0.0287,  ..., -0.0349,  0.0194, -0.0321],\n",
       "         ...,\n",
       "         [ 0.0206,  0.0075, -0.0162,  ...,  0.0123,  0.0315,  0.0052],\n",
       "         [-0.0284,  0.0224, -0.0045,  ...,  0.0043, -0.0128, -0.0331],\n",
       "         [-0.0164, -0.0119,  0.0077,  ..., -0.0063, -0.0213, -0.0039]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-2.6666e-03, -4.5208e-03,  9.4372e-03,  2.6774e-02, -3.0523e-02,\n",
       "          3.4087e-02, -2.5537e-02, -3.3325e-02, -1.1253e-02, -1.1701e-02,\n",
       "          2.2020e-02, -2.0655e-02,  1.8688e-02, -3.2928e-02, -2.4582e-02,\n",
       "          2.0587e-02,  3.1236e-03, -5.4676e-03,  1.6306e-02,  2.0751e-02,\n",
       "          2.3244e-02,  2.9762e-02, -3.0356e-03,  3.5635e-04, -2.7325e-02,\n",
       "          1.4769e-02, -3.2274e-02, -2.9560e-02,  6.6710e-03, -3.0685e-02,\n",
       "          2.7835e-02,  2.1929e-03,  1.8481e-02, -2.6092e-03,  1.4547e-02,\n",
       "         -3.2893e-02,  8.3313e-03,  3.2765e-02, -3.2053e-02,  3.0727e-02,\n",
       "         -3.4867e-02,  2.2378e-02, -1.5955e-02,  1.5890e-02,  2.2039e-02,\n",
       "         -6.6491e-03, -2.8253e-02,  2.6502e-02,  3.1235e-02, -1.2759e-02,\n",
       "          3.0064e-02, -1.9725e-02,  3.5005e-02, -1.6609e-02,  6.5721e-03,\n",
       "         -1.1211e-02, -1.5888e-02,  1.4006e-02, -1.4073e-02,  7.4777e-03,\n",
       "         -2.6260e-02,  3.3170e-02, -3.2812e-02,  1.0601e-02, -1.6354e-03,\n",
       "         -1.9219e-02,  3.0199e-02,  1.1977e-02, -1.9611e-03,  1.0922e-03,\n",
       "          1.9408e-02,  4.9770e-03,  3.3818e-02, -1.2594e-04, -7.1725e-03,\n",
       "          2.6049e-02,  3.0169e-02,  1.0443e-02,  2.3714e-02,  1.5079e-02,\n",
       "          1.6056e-02,  1.8046e-02, -3.1013e-02, -1.3856e-03, -1.6319e-02,\n",
       "          1.1882e-02, -7.2799e-03,  1.3527e-02,  3.8701e-03, -3.4926e-02,\n",
       "         -2.7127e-02,  2.1610e-03,  9.3084e-03, -2.8252e-02,  3.1802e-02,\n",
       "          2.2277e-02,  1.5076e-02, -8.9704e-03, -1.7410e-02, -2.5786e-02,\n",
       "         -6.8669e-03, -4.8666e-03,  4.8273e-03,  1.6822e-02, -2.5295e-02,\n",
       "          2.8617e-02,  2.6121e-02, -8.7399e-03,  5.1381e-03, -7.9065e-03,\n",
       "          3.4130e-02,  2.3020e-02,  6.0022e-03,  8.0166e-03, -3.2113e-02,\n",
       "          8.2507e-03,  1.7421e-02, -9.5181e-03, -3.0391e-02, -2.7454e-02,\n",
       "          3.4547e-02,  1.5369e-02, -2.8389e-02,  3.1836e-03, -2.7207e-02,\n",
       "         -3.2097e-02, -3.0517e-02, -2.8359e-02, -2.4414e-02, -2.1536e-03,\n",
       "         -5.2694e-03, -2.3988e-02, -1.6553e-02,  4.5376e-03,  2.7229e-02,\n",
       "          1.4417e-02, -4.7350e-03, -8.4298e-03, -3.7720e-03,  1.9978e-02,\n",
       "         -5.4810e-03,  1.9969e-02, -3.1413e-02,  6.7866e-03,  6.6105e-03,\n",
       "         -2.6723e-03,  2.9226e-03,  1.5169e-02,  1.4910e-02, -9.4341e-03,\n",
       "         -3.0547e-03,  6.3010e-04,  1.7373e-02,  1.1949e-02,  7.7542e-03,\n",
       "         -2.6191e-02, -8.3899e-03,  5.6656e-03,  1.5295e-02,  1.5515e-02,\n",
       "          3.0052e-02, -4.0128e-04,  6.5024e-03, -2.3116e-02, -2.2277e-02,\n",
       "         -3.0694e-02, -3.1925e-02, -1.0094e-02, -1.7842e-02,  2.4646e-02,\n",
       "          1.2142e-02, -1.4733e-02,  2.8689e-02, -2.2871e-02, -7.1761e-03,\n",
       "         -2.3000e-02, -2.9817e-02, -2.4764e-02,  2.3658e-02, -9.9406e-03,\n",
       "         -1.6497e-02, -1.8477e-02,  3.2493e-04,  2.3957e-02, -2.0058e-02,\n",
       "         -2.2575e-02, -7.9751e-03,  3.0402e-02, -2.4642e-02,  2.3488e-03,\n",
       "         -2.2038e-03,  1.5615e-02, -1.0370e-02, -3.4095e-02, -2.1686e-02,\n",
       "         -9.7754e-03,  1.0255e-02,  1.7468e-03, -3.1784e-02, -6.5732e-03,\n",
       "          1.6503e-02, -3.0428e-02, -2.1011e-02,  3.7526e-03, -9.1247e-05,\n",
       "          2.2370e-02,  4.6221e-03, -1.1127e-02, -5.6280e-03,  4.8970e-03,\n",
       "         -4.7679e-03, -8.4621e-03,  3.5586e-02,  2.6526e-02, -2.8395e-02,\n",
       "         -2.5446e-02,  3.8946e-03,  1.4720e-02,  1.9602e-02, -3.4116e-02,\n",
       "          1.3717e-02,  1.7519e-02, -3.3696e-02,  2.8479e-02, -2.5037e-02,\n",
       "         -2.7367e-02, -2.2857e-02, -2.3208e-02,  7.8910e-03, -3.4256e-02,\n",
       "         -1.6216e-02, -2.7514e-02,  1.0830e-02, -4.6931e-03,  9.6228e-03,\n",
       "         -3.1622e-02, -3.5430e-02, -5.2664e-03,  4.7688e-03, -1.2385e-02,\n",
       "          2.2813e-02, -1.9066e-02,  5.0211e-03,  7.7746e-03,  9.5261e-03,\n",
       "          1.9094e-02,  3.0419e-02,  1.8350e-02, -9.5637e-03,  1.9901e-03,\n",
       "          2.5500e-02,  1.4976e-03,  3.6849e-03,  1.3157e-02, -2.0191e-03,\n",
       "          2.9826e-03, -3.1511e-02, -2.1116e-02, -2.6545e-02, -1.7739e-02,\n",
       "          7.1687e-03, -6.9654e-03,  2.5318e-02, -3.1081e-03,  2.8198e-02,\n",
       "         -3.3457e-02, -2.0229e-02, -1.7261e-02,  2.0949e-02, -9.7368e-03,\n",
       "         -2.7453e-02, -2.1601e-02, -5.4159e-03, -3.3351e-02,  1.2184e-03,\n",
       "          5.1129e-03,  3.2375e-02,  2.7310e-02,  2.9346e-02, -2.8768e-02,\n",
       "         -2.8158e-02, -3.0869e-02,  1.8735e-02, -1.2012e-02,  2.1680e-02,\n",
       "          7.6730e-03,  1.2831e-02,  3.1253e-02, -2.3720e-02,  1.9913e-02,\n",
       "         -3.5053e-02,  2.0548e-02, -8.5369e-03, -1.0280e-02, -3.4195e-02,\n",
       "          1.7318e-02,  2.7518e-02, -4.7106e-03,  2.7134e-02,  8.5200e-03],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 0.0335,  0.0053,  0.0440,  ...,  0.0552,  0.0108, -0.0318],\n",
       "         [ 0.0202,  0.0345, -0.0161,  ..., -0.0380,  0.0573,  0.0218],\n",
       "         [-0.0236,  0.0069, -0.0117,  ..., -0.0241,  0.0231, -0.0429],\n",
       "         ...,\n",
       "         [ 0.0408, -0.0381,  0.0443,  ...,  0.0266,  0.0488,  0.0520],\n",
       "         [ 0.0180,  0.0515,  0.0033,  ...,  0.0402, -0.0001, -0.0397],\n",
       "         [ 0.0209,  0.0285,  0.0196,  ...,  0.0437,  0.0066, -0.0533]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0156,  0.0361, -0.0023, -0.0505, -0.0573, -0.0474, -0.0308, -0.0047,\n",
       "          0.0305, -0.0106,  0.0201,  0.0017,  0.0084,  0.0007,  0.0215,  0.0149,\n",
       "          0.0437,  0.0084,  0.0205,  0.0306, -0.0552,  0.0173,  0.0082,  0.0331,\n",
       "          0.0197, -0.0058, -0.0564,  0.0505,  0.0303,  0.0160,  0.0124, -0.0429,\n",
       "         -0.0475,  0.0053, -0.0009,  0.0489,  0.0004,  0.0116,  0.0138, -0.0425,\n",
       "         -0.0561, -0.0174, -0.0023,  0.0438,  0.0201,  0.0199,  0.0320,  0.0255,\n",
       "         -0.0109, -0.0147,  0.0265,  0.0227, -0.0356,  0.0144, -0.0407, -0.0312,\n",
       "         -0.0279, -0.0099,  0.0048, -0.0372,  0.0244,  0.0332,  0.0332,  0.0395,\n",
       "         -0.0024, -0.0322, -0.0166, -0.0545,  0.0512,  0.0387, -0.0249,  0.0296,\n",
       "         -0.0092, -0.0170, -0.0355, -0.0014, -0.0234, -0.0044,  0.0542,  0.0248,\n",
       "          0.0112, -0.0390, -0.0386,  0.0296,  0.0493, -0.0458, -0.0006, -0.0098,\n",
       "         -0.0214, -0.0355,  0.0369,  0.0393,  0.0467,  0.0412,  0.0536,  0.0533,\n",
       "          0.0116,  0.0307, -0.0336,  0.0406], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 0.0987, -0.0950, -0.0925, -0.0611,  0.0255,  0.0990,  0.0212,  0.0764,\n",
       "           0.0762, -0.0707,  0.0592, -0.0297, -0.0051,  0.0052, -0.0209, -0.0235,\n",
       "           0.0458,  0.0534, -0.0529,  0.0245, -0.0195, -0.0277,  0.0065, -0.0852,\n",
       "          -0.0018,  0.0115,  0.0150, -0.0870,  0.0920,  0.0070, -0.0414, -0.0964,\n",
       "           0.0241, -0.0540,  0.0518, -0.0036,  0.0705, -0.0368, -0.0112,  0.0246,\n",
       "          -0.0691, -0.0052,  0.0410, -0.0336, -0.0948, -0.0465,  0.0677, -0.0373,\n",
       "          -0.0455, -0.0908, -0.0823, -0.0232,  0.0265, -0.0898,  0.0704,  0.0901,\n",
       "          -0.0106, -0.0327,  0.0918, -0.0990,  0.0619,  0.0514, -0.0617,  0.0231,\n",
       "           0.0296, -0.0375,  0.0179,  0.0086,  0.0657,  0.0203,  0.0898, -0.0093,\n",
       "           0.0784,  0.0094,  0.0608,  0.0497,  0.0739, -0.0358,  0.0481,  0.0499,\n",
       "          -0.0938,  0.0937, -0.0060,  0.0559,  0.0585,  0.0976, -0.0457,  0.0389,\n",
       "          -0.0592, -0.0099, -0.0528,  0.0428,  0.0258, -0.0664, -0.0213, -0.0027,\n",
       "           0.0795, -0.0304,  0.0895, -0.0776],\n",
       "         [-0.0684, -0.0281,  0.0631,  0.0161, -0.0389,  0.0972, -0.0910, -0.0819,\n",
       "           0.0670,  0.0922,  0.0309,  0.0317, -0.0828,  0.0946, -0.0049, -0.0577,\n",
       "           0.0625,  0.0921, -0.0301, -0.0506,  0.0687, -0.0263, -0.0240, -0.0399,\n",
       "          -0.0362, -0.0128, -0.0353, -0.0309, -0.0665, -0.0823,  0.0382,  0.0012,\n",
       "          -0.0468,  0.0254, -0.0332,  0.0065, -0.0385,  0.0835,  0.0735,  0.0373,\n",
       "          -0.0732, -0.0991,  0.0373,  0.0218, -0.0056,  0.0519, -0.0785,  0.0238,\n",
       "          -0.0887, -0.0459,  0.0931, -0.0537,  0.0748,  0.0303,  0.0400,  0.0465,\n",
       "          -0.0470, -0.0789,  0.0503,  0.0826,  0.0794,  0.0877, -0.0595, -0.0420,\n",
       "          -0.0029, -0.0683,  0.0729,  0.0065, -0.0458, -0.0349, -0.0499,  0.0978,\n",
       "          -0.0713, -0.0709,  0.0647,  0.0717, -0.0909, -0.0886,  0.0288, -0.0747,\n",
       "           0.0450,  0.0641, -0.0161, -0.0921, -0.0782,  0.0850,  0.0281,  0.0475,\n",
       "           0.0999,  0.0132,  0.0231, -0.0571, -0.0410, -0.0935, -0.0353, -0.0577,\n",
       "           0.0965,  0.0219, -0.0670,  0.0406],\n",
       "         [ 0.0790, -0.0142, -0.0798,  0.0149, -0.0926, -0.0865,  0.0789, -0.0989,\n",
       "          -0.0460,  0.0257, -0.0697,  0.0061, -0.0395,  0.0357, -0.0205, -0.0760,\n",
       "          -0.0008, -0.0305,  0.0458,  0.0854, -0.0909,  0.0483, -0.0590,  0.0989,\n",
       "          -0.0753,  0.0996,  0.0875, -0.0991,  0.0588, -0.0780,  0.0677, -0.0293,\n",
       "          -0.0991,  0.0640, -0.0008, -0.0451, -0.0517,  0.0444,  0.0860,  0.0498,\n",
       "           0.0972, -0.0057, -0.0075,  0.0534,  0.1000, -0.0823,  0.0399,  0.0626,\n",
       "          -0.0007, -0.0568,  0.0521,  0.0657, -0.0252, -0.0569,  0.0369, -0.0998,\n",
       "          -0.0560, -0.0740,  0.0059, -0.0083,  0.0679, -0.0435, -0.0642, -0.0492,\n",
       "          -0.0747, -0.0646,  0.0543, -0.0724,  0.0514, -0.0781,  0.0589,  0.0951,\n",
       "           0.0482, -0.0756, -0.0504,  0.0813,  0.0951, -0.0933,  0.0138, -0.0107,\n",
       "          -0.0893, -0.0407,  0.0492, -0.0296, -0.0474, -0.0349,  0.0714, -0.0566,\n",
       "           0.0308,  0.0956, -0.0562,  0.0681,  0.0545, -0.0092,  0.0036,  0.0095,\n",
       "           0.0545, -0.0203, -0.0024,  0.0958],\n",
       "         [-0.0533, -0.0215, -0.0327,  0.0987,  0.0677, -0.0581, -0.0526,  0.0934,\n",
       "           0.0821, -0.0122,  0.0525, -0.0291,  0.0142, -0.0739, -0.0280, -0.0211,\n",
       "          -0.0936, -0.0689,  0.0146,  0.0640, -0.0774,  0.0497, -0.0881, -0.0030,\n",
       "           0.0358, -0.0607, -0.0004,  0.0682, -0.0750,  0.0143, -0.0560,  0.0701,\n",
       "          -0.0899,  0.0567,  0.0461,  0.0386, -0.0376,  0.0743,  0.0335,  0.0857,\n",
       "          -0.0399, -0.0718,  0.0827,  0.0323,  0.0134, -0.0794, -0.0301,  0.0298,\n",
       "          -0.0152,  0.0037,  0.0272,  0.0865,  0.0215, -0.0051,  0.0596, -0.0190,\n",
       "          -0.0878,  0.0816, -0.0713,  0.0949, -0.0668, -0.0645, -0.0272,  0.0132,\n",
       "           0.0525,  0.0839, -0.0752,  0.0843,  0.0892, -0.0949, -0.0940, -0.0045,\n",
       "           0.0816,  0.0332, -0.0944, -0.0219,  0.0325, -0.0837,  0.0414, -0.0740,\n",
       "          -0.0307, -0.0673, -0.0058, -0.0832, -0.0247,  0.0129, -0.0777,  0.0012,\n",
       "           0.0600,  0.0837,  0.0119,  0.0540, -0.0309, -0.0142, -0.0620, -0.0634,\n",
       "          -0.0671, -0.0245, -0.0204, -0.0892],\n",
       "         [ 0.0871,  0.0849,  0.0008,  0.0307, -0.0253,  0.0057,  0.0982,  0.0723,\n",
       "          -0.0503,  0.0183,  0.0415, -0.0969, -0.0062,  0.0779, -0.0856,  0.0326,\n",
       "          -0.0975, -0.0388, -0.0919, -0.0896, -0.0175, -0.0487, -0.0399, -0.0356,\n",
       "          -0.0188, -0.0858, -0.0036, -0.0312,  0.0366,  0.0978, -0.0824, -0.0044,\n",
       "           0.0160, -0.0523, -0.0520, -0.0688, -0.0831,  0.0083,  0.0190,  0.0601,\n",
       "           0.0643, -0.0358, -0.0663, -0.0331, -0.0703,  0.0956,  0.0608, -0.0924,\n",
       "          -0.0339, -0.0861, -0.0367, -0.0980, -0.0843, -0.0052,  0.0764,  0.0468,\n",
       "           0.0423, -0.0511,  0.0550,  0.0275, -0.0170, -0.0147,  0.0236,  0.0102,\n",
       "          -0.0859,  0.0886, -0.0269,  0.0159, -0.0627, -0.0800,  0.0248,  0.0084,\n",
       "           0.0465,  0.0603, -0.0631, -0.0023,  0.0845, -0.0083,  0.0838,  0.0211,\n",
       "           0.0293,  0.0695,  0.0491, -0.0691,  0.0116, -0.0325,  0.0861,  0.0043,\n",
       "           0.0474, -0.0754, -0.0376, -0.0621, -0.0739, -0.0443, -0.0778, -0.0874,\n",
       "          -0.0305,  0.0926, -0.0572, -0.0728],\n",
       "         [ 0.0653,  0.0961, -0.0819, -0.0752, -0.0354, -0.0743, -0.0125, -0.0907,\n",
       "          -0.0250,  0.0081,  0.0573,  0.0988,  0.0040, -0.0932, -0.0187, -0.0085,\n",
       "          -0.0368, -0.0674, -0.0109, -0.0781,  0.0449, -0.0088, -0.0937, -0.0475,\n",
       "          -0.0945, -0.0993,  0.0831,  0.0956,  0.0834, -0.0577, -0.0250,  0.0126,\n",
       "          -0.0724, -0.0795, -0.0224,  0.0641, -0.0019, -0.0926,  0.0868, -0.0508,\n",
       "           0.0952, -0.0066, -0.0220,  0.0010,  0.0361,  0.0438,  0.0857, -0.0416,\n",
       "          -0.0100, -0.0477,  0.0066, -0.0648,  0.0418,  0.0607, -0.0750,  0.0082,\n",
       "          -0.0615, -0.0699,  0.0220, -0.0557, -0.0665, -0.0939,  0.0481, -0.0283,\n",
       "          -0.0481,  0.0794, -0.0711,  0.0918,  0.0913, -0.0166,  0.0941,  0.0313,\n",
       "           0.0943, -0.0850, -0.0236,  0.0762, -0.0227, -0.0646,  0.0608, -0.0411,\n",
       "           0.0780,  0.0572, -0.0738, -0.0125,  0.0510, -0.0889, -0.0407, -0.0285,\n",
       "          -0.0365,  0.0936,  0.0727, -0.0620, -0.0973,  0.0971, -0.1000, -0.0062,\n",
       "          -0.0987, -0.0688, -0.0089,  0.0841],\n",
       "         [ 0.0229,  0.0864,  0.0043, -0.0543, -0.0219,  0.0722, -0.0187,  0.0088,\n",
       "           0.0081,  0.0106, -0.0055,  0.0645,  0.0811, -0.0393,  0.0315,  0.0309,\n",
       "          -0.0120, -0.0918,  0.0290, -0.0304, -0.0180,  0.0910, -0.0674,  0.0728,\n",
       "           0.0807,  0.0933, -0.0191,  0.0219,  0.0027, -0.0326, -0.0822, -0.0607,\n",
       "          -0.0267, -0.0810,  0.0560, -0.0670,  0.0645, -0.0024, -0.0497, -0.0776,\n",
       "           0.0211,  0.0044, -0.0980, -0.0473,  0.0567, -0.0806,  0.0101,  0.0360,\n",
       "           0.0244,  0.0671, -0.0819, -0.0988,  0.0168,  0.0554, -0.0996,  0.0693,\n",
       "           0.0546, -0.0502,  0.0201,  0.0256, -0.0250,  0.0594,  0.0722, -0.0880,\n",
       "           0.0987, -0.0461, -0.0325,  0.0267, -0.0389,  0.0686,  0.0002,  0.0687,\n",
       "           0.0109,  0.0622, -0.0524,  0.0070,  0.0840,  0.0003, -0.0840,  0.0809,\n",
       "          -0.0675, -0.0284, -0.0913, -0.0058,  0.0919, -0.0290,  0.0498,  0.0967,\n",
       "          -0.0029,  0.0565, -0.0790, -0.0319, -0.0425,  0.0904,  0.0954,  0.0845,\n",
       "          -0.0442, -0.0692, -0.0893,  0.0595],\n",
       "         [-0.0889, -0.0828, -0.0813, -0.0637,  0.0059, -0.0506, -0.0662,  0.0895,\n",
       "           0.0624, -0.0245,  0.0217,  0.0893, -0.0577,  0.0379, -0.0242,  0.0364,\n",
       "          -0.0626, -0.0533, -0.0787, -0.0754,  0.0049, -0.0163,  0.0475,  0.0737,\n",
       "           0.0660, -0.0041, -0.0596, -0.0532, -0.0053,  0.0155, -0.0743,  0.0951,\n",
       "           0.0171,  0.0759, -0.0413,  0.0777, -0.0004, -0.0825,  0.0716, -0.0885,\n",
       "          -0.0687, -0.0757,  0.0766, -0.0878,  0.0918,  0.0886, -0.0472, -0.0941,\n",
       "           0.0051, -0.0351,  0.0789, -0.0238,  0.0614, -0.0668,  0.0607,  0.0095,\n",
       "          -0.0065, -0.0666, -0.0078,  0.0256,  0.0046, -0.0169, -0.0430,  0.0974,\n",
       "           0.0077, -0.0794,  0.0819, -0.0865,  0.0188,  0.0838, -0.0905,  0.0506,\n",
       "           0.0329,  0.0575, -0.0056,  0.0620,  0.0384,  0.0671,  0.0067,  0.0711,\n",
       "          -0.0267, -0.0188,  0.0560, -0.0820, -0.0210,  0.0919, -0.0417, -0.0121,\n",
       "           0.0330, -0.0609,  0.0170, -0.0441,  0.0596, -0.0535, -0.0095, -0.0273,\n",
       "          -0.0859, -0.0123, -0.0074,  0.0121],\n",
       "         [ 0.0320, -0.0940, -0.0932, -0.0527,  0.0496, -0.0084,  0.0211,  0.0400,\n",
       "           0.0103,  0.0352,  0.0438,  0.0686, -0.0069, -0.0610,  0.0436,  0.0600,\n",
       "           0.0638, -0.0048, -0.0025, -0.0136, -0.0620, -0.0261,  0.0113, -0.0644,\n",
       "           0.0688, -0.0769,  0.0908,  0.0292, -0.0408,  0.0997, -0.0664, -0.0011,\n",
       "           0.0550, -0.0490,  0.0770,  0.0293,  0.0854, -0.0586,  0.0103, -0.0686,\n",
       "           0.0635,  0.0978,  0.0766,  0.0047,  0.0648, -0.0228, -0.0247,  0.0405,\n",
       "          -0.0171,  0.0870, -0.0568,  0.0925,  0.0266,  0.0066, -0.0660, -0.0308,\n",
       "           0.0220, -0.0780,  0.0774, -0.0800, -0.0302, -0.0321,  0.0404,  0.0627,\n",
       "          -0.0011,  0.0650,  0.0134,  0.0224, -0.0127,  0.0138,  0.0412, -0.0864,\n",
       "          -0.0487,  0.0902, -0.0054, -0.0139,  0.0707,  0.0373, -0.0454,  0.0410,\n",
       "           0.0045, -0.0217,  0.0447,  0.0883,  0.0587, -0.0518,  0.0800,  0.0338,\n",
       "           0.0663,  0.0289, -0.0716, -0.0483, -0.0671,  0.0295,  0.0285,  0.0596,\n",
       "           0.0248, -0.0639,  0.0989,  0.0071],\n",
       "         [ 0.0752, -0.0973,  0.0002, -0.0904,  0.0728, -0.0332,  0.0179,  0.0454,\n",
       "          -0.0017, -0.0267, -0.0237,  0.0452, -0.0298, -0.0505,  0.0373, -0.0091,\n",
       "           0.0639,  0.0673, -0.0563,  0.0299, -0.0068,  0.0522, -0.0287,  0.0699,\n",
       "          -0.0373, -0.0133,  0.0455, -0.0651,  0.0645,  0.0657,  0.0049, -0.0821,\n",
       "           0.0999, -0.0663, -0.0980, -0.0755, -0.0660, -0.0485, -0.0109, -0.0933,\n",
       "          -0.0350, -0.0886,  0.0378, -0.0332,  0.0450, -0.0103, -0.0826,  0.0318,\n",
       "           0.0216, -0.0214, -0.0465, -0.0965, -0.0512, -0.0001,  0.0129, -0.0170,\n",
       "           0.0009, -0.0444, -0.0315,  0.0192, -0.0333,  0.0176, -0.0935, -0.0772,\n",
       "          -0.0276,  0.0217, -0.0379, -0.0212,  0.0036, -0.0120, -0.0948, -0.0632,\n",
       "           0.0842,  0.0529,  0.0755,  0.0962,  0.0645, -0.0699, -0.0993, -0.0635,\n",
       "           0.0426,  0.0890, -0.0578,  0.0541,  0.0143, -0.0375,  0.0169,  0.0317,\n",
       "          -0.0316,  0.0010, -0.0165, -0.0096,  0.0225,  0.0370,  0.0919,  0.0821,\n",
       "          -0.0607, -0.0776,  0.0403, -0.0842]], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0335,  0.0155,  0.0380, -0.0946,  0.0885,  0.0326,  0.0474, -0.0822,\n",
       "          0.0401,  0.0558], requires_grad=True)]"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 70
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ],
   "id": "8f31a62400ff6e16"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:32:21.614428Z",
     "start_time": "2025-01-15T07:32:21.610950Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package,随机梯度下降\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ],
   "id": "a7706300876c114a",
   "outputs": [],
   "execution_count": 73
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:32:29.806705Z",
     "start_time": "2025-01-15T07:32:29.710219Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad() # 装饰器，禁止反向传播，节省内存\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = [] # 记录损失\n",
    "    pred_list = [] # 记录预测\n",
    "    label_list = [] # 记录标签\n",
    "    for datas, labels in dataloader:#10000/32=312\n",
    "        datas = datas.to(device) # 转到GPU\n",
    "        labels = labels.to(device) # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item()) # 记录损失\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
    "    return np.mean(loss_list), acc"
   ],
   "id": "58715ddb81d0efba",
   "outputs": [],
   "execution_count": 74
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:32:33.277877Z",
     "start_time": "2025-01-15T07:32:33.273798Z"
    }
   },
   "cell_type": "code",
   "source": "1875*20",
   "id": "c036670941d5bed1",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37500"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 75
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:35:59.160330Z",
     "start_time": "2025-01-15T07:32:45.719677Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch): # 训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
    "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1) # 训练集预测\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval() # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train() # 进入训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1 # 全局步数加1\n",
    "                pbar.update(1) # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 20 #改为40\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ],
   "id": "d7467e702c982154",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "585286e758424951b7eac28718bd5f30"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 76
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:35:59.166830Z",
     "start_time": "2025-01-15T07:35:59.162677Z"
    }
   },
   "cell_type": "code",
   "source": "record[\"train\"][-5:] # 最后5个训练集信息",
   "id": "70c7bfd603546ca2",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.20323796570301056, 'acc': 0.9375, 'step': 37495},\n",
       " {'loss': 0.3629520833492279, 'acc': 0.90625, 'step': 37496},\n",
       " {'loss': 0.4123780429363251, 'acc': 0.90625, 'step': 37497},\n",
       " {'loss': 0.4099973738193512, 'acc': 0.90625, 'step': 37498},\n",
       " {'loss': 0.16503064334392548, 'acc': 0.9375, 'step': 37499}]"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 77
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:35:59.180282Z",
     "start_time": "2025-01-15T07:35:59.167900Z"
    }
   },
   "cell_type": "code",
   "source": "record[\"val\"][-5:] # 最后5个验证集信息",
   "id": "679052f4b98e08ad",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': np.float64(0.3574331014777144), 'acc': 0.8728, 'step': 33000},\n",
       " {'loss': np.float64(0.35949956654264525), 'acc': 0.8717, 'step': 34000},\n",
       " {'loss': np.float64(0.3644140106968034), 'acc': 0.8685, 'step': 35000},\n",
       " {'loss': np.float64(0.36543631721466496), 'acc': 0.8676, 'step': 36000},\n",
       " {'loss': np.float64(0.3536070313649817), 'acc': 0.8722, 'step': 37000}]"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 78
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:40:19.383806Z",
     "start_time": "2025-01-15T07:40:19.215236Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1] # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid() # 显示网格\n",
    "        axs[idx].legend() # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "id": "510eb9da6e2c6c94",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.18750\n",
      "1000     0.59375\n",
      "2000     0.81250\n",
      "3000     0.84375\n",
      "4000     0.84375\n",
      "5000     0.78125\n",
      "6000     0.87500\n",
      "7000     0.81250\n",
      "8000     0.84375\n",
      "9000     0.87500\n",
      "10000    0.84375\n",
      "11000    0.87500\n",
      "12000    0.90625\n",
      "13000    0.84375\n",
      "14000    0.90625\n",
      "15000    0.84375\n",
      "16000    0.84375\n",
      "17000    0.75000\n",
      "18000    0.78125\n",
      "19000    0.87500\n",
      "20000    0.87500\n",
      "21000    0.90625\n",
      "22000    0.75000\n",
      "23000    0.87500\n",
      "24000    0.87500\n",
      "25000    0.87500\n",
      "26000    0.78125\n",
      "27000    0.90625\n",
      "28000    0.87500\n",
      "29000    0.78125\n",
      "30000    0.90625\n",
      "31000    0.81250\n",
      "32000    0.84375\n",
      "33000    0.90625\n",
      "34000    0.78125\n",
      "35000    0.90625\n",
      "36000    0.90625\n",
      "37000    0.84375\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.1239\n",
      "1000     0.6732\n",
      "2000     0.7818\n",
      "3000     0.8052\n",
      "4000     0.8095\n",
      "5000     0.7965\n",
      "6000     0.8190\n",
      "7000     0.8286\n",
      "8000     0.8343\n",
      "9000     0.8356\n",
      "10000    0.8402\n",
      "11000    0.8457\n",
      "12000    0.8427\n",
      "13000    0.8484\n",
      "14000    0.8508\n",
      "15000    0.8497\n",
      "16000    0.8476\n",
      "17000    0.8548\n",
      "18000    0.8521\n",
      "19000    0.8571\n",
      "20000    0.8559\n",
      "21000    0.8578\n",
      "22000    0.8585\n",
      "23000    0.8602\n",
      "24000    0.8579\n",
      "25000    0.8637\n",
      "26000    0.8631\n",
      "27000    0.8575\n",
      "28000    0.8677\n",
      "29000    0.8577\n",
      "30000    0.8630\n",
      "31000    0.8724\n",
      "32000    0.8668\n",
      "33000    0.8728\n",
      "34000    0.8717\n",
      "35000    0.8685\n",
      "36000    0.8676\n",
      "37000    0.8722\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 79
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 评估",
   "id": "5877b64ea3b67b58"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-15T07:40:33.276306Z",
     "start_time": "2025-01-15T07:40:32.132864Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "model.eval() # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "id": "79c6aff4c8838e29",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3644\n",
      "accuracy: 0.8662\n"
     ]
    }
   ],
   "execution_count": 80
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
